<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    "use strict";

    // ES5严格模式
    // 解决传统代码在使用过程中出现的一些 不合理 不严谨 不安全的地方

    // 优点
    //     - 消除Javascript语法的一些不合理、不严谨之处，减少一些怪异行为;
    //     (1.全局变量要显式的声明，否则会报错；必须先声明变量然后再使用。)
    //     (2.创建eval()作用域)
    
    // 　　- 消除代码运行的一些不安全之处，保证代码运行的安全;
    //     (1. 禁止this关键字指向全局对象。)
    
    // 　　- 提高编译器效率，提高运行速度；
    
    // 　　- 为未来新版本的Javascript做好铺垫。

    // 如何进入严格模式?
    // 在作用域的最前面 添加关键词 "use strict";
    //    (1)  全局作用域  => 当前script脚本的最前面 添加关键词 "use strict";
    //    (2)  函数作用域  => 函数所有代码的最前面 


    // function demo(){
    //     "use strict";
    // }



    // (1) 严格模式下,不通过关键词直接声明变量会报错
    // var a = 1;
    // b = 2;
    // console.log(a, b);

    // (2) 严格模式下,函数的参数名不允许重复使用 => 报错 (Duplicate parameter name not allowed in this context)
    // function fn(a, b, b) {
    //     return a + b;
    // }
    // console.log(fn(1, 2, 3));

    // (3) 严格模式中,新eval作用域, 在eval()方法中声明的变量也是局部的
    // eval("var a = 1; var b = 2; var c = a + b; console.log(a,b,c)");
    // console.log(a, b, c);


    // (4)  严格模式中, 禁止this指向window (函数在调用时要有依存对象,没有依存对象的默认指向undefined)

    // function fn(){
    //     console.log(this);
    // }

    // fn();// this -> undefined  没有依存对象
    // window.fn();  //  this -> window  有依存对象


    // (5)  严格模式中,删除全局变量会报错 ( Cannot delete property 'a' of #<Window>  => 不能删除 window的属性 'a')

    // var a = 1;
    // var b = 2;
    // console.log(window.a,window.b);  // window对象

    // console.log(delete window.a);
    // console.log(delete window.b);



    










</script>
</html>